﻿Imports System.IO

Public Class clsGrabarLog

#Region "DECLARACION DE PROPIEDADES"
    'Propiedades para la impersonalizacion
    Private propDominioImpersonalizacion As String
    Private propUsuarioImpersonalizacion As String
    Private propPasswordImpersonalizacion As String
    Private propImpersonalizar As Boolean

    'Propiedad de logueo
    Private propRutaLog As String

    'Propiedades para conectar al Servidor de Mail en caso de ser requerido el error
    Private propServidor As String
    Private propCorreoDesde As String
    Private propNombreDesde As String
    Private propCorreoDestino As String
    Private propEnviaMail As Boolean
#End Region

#Region "METODOS DE ACCESO A LAS PROPIEDADES"
    ''' <summary>
    ''' Dominio para la impersonalizacion de acceso al archivo LOG
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property DominioImpersonalizacion() As String
        Get
            Return Me.propDominioImpersonalizacion
        End Get
        Set(ByVal value As String)
            Me.propDominioImpersonalizacion = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' Nombre de usuario para la impersonalizacion  de acceso al archivo LOG
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property UsuarioImpersonalizacion() As String
        Get
            Return Me.propUsuarioImpersonalizacion
        End Get
        Set(ByVal value As String)
            Me.propUsuarioImpersonalizacion = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' password de usuario para la impersonalizacion de acceso al archivo LOG
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property PasswordImpersonalizacion() As String
        Get
            Return Me.propPasswordImpersonalizacion
        End Get
        Set(ByVal value As String)
            Me.propPasswordImpersonalizacion = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' Determina si se impersonaliza o no el acceso al Log [SI / NO ]
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Impersonalizar() As Boolean
        Get
            Return Me.propImpersonalizar
        End Get
        Set(ByVal value As Boolean)
            Me.propImpersonalizar = value
        End Set
    End Property

    ''' <summary>
    ''' Ruta donde se generara e Archivo LOG, incluye el nombre del archivo
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property RutaLog() As String
        Get
            Return Me.propRutaLog
        End Get
        Set(ByVal value As String)
            Me.propRutaLog = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' Servidor de Correo para el envio de mail
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ServidorMail() As String
        Get
            Return Me.propServidor
        End Get
        Set(ByVal value As String)
            Me.propServidor = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' Correo desde el cual se enviara
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property CorreoDesde() As String
        Get
            Return Me.propCorreoDesde
        End Get
        Set(ByVal value As String)
            Me.propCorreoDesde = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' Nombre de quien envia el correo
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property NombreDesde() As String
        Get
            Return Me.propNombreDesde
        End Get
        Set(ByVal value As String)
            Me.propNombreDesde = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' Correo o correos de destino
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property CorreoDestino() As String
        Get
            Return Me.propCorreoDestino
        End Get
        Set(ByVal value As String)
            Me.propCorreoDestino = value.Trim
        End Set
    End Property

    ''' <summary>
    ''' Configura si se envia mail en caso de error de logueo
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property EnviaMail() As Boolean
        Get
            Return Me.propEnviaMail
        End Get
        Set(ByVal value As Boolean)
            Me.propEnviaMail = value
        End Set
    End Property
#End Region

#Region "FUNCIONES DE LA CLASE"
    ''' <summary>
    ''' Graba el log enviado en el archivo configurado
    ''' </summary>
    ''' <param name="strProceso">Proceso desde el cual se envia el log</param>
    ''' <param name="strMensaje">Mensaje de Log</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GrabarLog(ByVal strProceso As String, ByVal strMensaje As String) As Boolean
        Dim myResul As Boolean = False

        Dim objImpersonalizador As New clsImpersonate(Me.propDominioImpersonalizacion, Me.propUsuarioImpersonalizacion, Me.propPasswordImpersonalizacion)
        Try
            Call objImpersonalizador.impersonateValidUser(Me.propImpersonalizar)
            If objImpersonalizador.Impersonalizo = True Then
                Dim sw As StreamWriter = New StreamWriter(Me.propRutaLog, True)
                sw.WriteLine("[" & DateTime.Now.ToString("HH:mm:ss") & "] : " & strProceso & " / " & strMensaje)
                sw.Close()
                objImpersonalizador.undoImpersonation()
            End If
        Catch ex As Exception
            If Me.propEnviaMail = True Then
                Dim objMail As New clsMail
                Dim strCuerpoMail As String = "<table border='1'><tr><td>Fecha/Hora :</td><td>" & Now.ToString("dd/MM/yyyy HH:mm:ss") & "</td></tr>"
                strCuerpoMail &= "<tr><td>Proceso  :</td><td>" & strProceso & "</td></tr>"
                strCuerpoMail &= "<tr><td>Mensaje  :</td><td>" & strMensaje & "</td></tr>"
                strCuerpoMail &= "<tr><td>ErrorProd:</td><td>" & ex.ToString & "</td></tr>"
                strCuerpoMail &= "</table>"
                Try
                    With objMail
                        .Asunto = "Error al Generar Log"
                        .CorreoDesde = Me.propCorreoDesde
                        .CorreoDestino = Me.propCorreoDestino
                        .EsHTML = True
                        .NombreDesde = Me.propNombreDesde
                        .ServidorMail = Me.propServidor
                        .CuerpoMensaje = strCuerpoMail
                        .EnvioMail()
                    End With
                Catch exMail As Exception
                Finally
                    objMail = Nothing
                End Try
            End If
        Finally
            objImpersonalizador = Nothing
        End Try
        Return myResul
    End Function

    ''' <summary>
    ''' Graba un log de error desde el proceso llamado
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub GrabarError(ByVal strProceso As String, ByVal strMensaje As String)
        Dim sw As StreamWriter = New StreamWriter(Me.propRutaLog, True)
        sw.WriteLine("[" & DateTime.Now.ToString("HH:mm:ss") & "] : " & strProceso & " / " & strMensaje)
        sw.Close()
    End Sub

    ''' <summary>
    ''' Elimina el Objeto de memoria
    ''' </summary>
    ''' <remarks></remarks>
    ''' 
    Public Sub Dispose()
        Try
            GC.SuppressFinalize(Me)
        Catch ex As Exception
        End Try
    End Sub
#End Region
End Class
